const schedule = require("node-schedule")
const { redisGet, redisSet, redisKeys } = require("../utils/redis")

const rule = new schedule.RecurrenceRule()
// 每3分钟执行一次
rule.minute = [0, 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48, 51, 54, 57]

// 获取所有以特定前缀开头的键
async function getKeysByPrefix(prefix) {
    try {
        // 假设 redisKeys 是一个封装了 KEYS 命令的函数
        // 如果 redisKeys 不存在，需要在 redis.js 中添加这个函数
        return await redisKeys(`${prefix}*`);
    } catch (error) {
        console.error('获取键列表失败:', error);
        return [];
    }
}

schedule.scheduleJob(rule, async () => {
    try {
        // 获取所有以 "aimuser:" 开头的键
        const userKeys = await getKeysByPrefix("mim-");
        // 遍历用户键列表
        for (let i = 0; i < userKeys.length; i++) {
            const userKey = userKeys[i];
            try {
                const userInfo = await redisGet(userKey);
                // 检查是否为有效的用户信息对象
                if (userInfo && typeof userInfo === 'object' && (userInfo.userType == 1 || userInfo.userType == 2)) {
                    // 根据userInfo.lastOnlineTime判断超过2分钟的改为离线
                    if (userInfo.lastOnlineTime && userInfo.online == 1) {
                        const now = new Date().getTime();
                        const twoMinutes = 2 * 60 * 1000;
                        if (now - userInfo.lastOnlineTime > twoMinutes) {
                            userInfo.online = 0;
                            userInfo.lastOnlineTime = now;
                            // 更新用户信息
                            await redisSet(userKey, userInfo);
                        }
                    } else { // 没有lastOnlineTime的设置为离线
                        if (userInfo.online == 1) {
                            userInfo.online = 0;
                            userInfo.lastOnlineTime = new Date().getTime();
                            // 更新用户信息
                            await redisSet(userKey, userInfo);
                        }
                    }
                } else {
                    console.log(`跳过非用户对象键: ${userKey}`);
                }
            } catch (userError) {
                console.error(`处理用户 ${userKey} 时出错:`, userError);
                // 继续处理下一个用户
                continue;
            }
        }
    } catch (error) {
        console.error('检查在线状态任务失败:', error);
    }
})
